﻿
#include<stdio.h>



//const修饰指针
//const常属性的意思，就不能改变意思
//int main()
//{
//	const int a = 10;
//	//这里的a被const在语法上面限制了a的修改
//	//a的本质还是变量
// 此时a变成了常变量
//	a = 20;
//	printf("%d", a);
//	return 0;
//}

//int main()
//{
//	const int a = 10;
//	printf("%d\n", a);
//
//
//	const int* pa = &a;
//	*pa = 20;
//	printf("%d \n", a);
//	return 0;
//}

//const修饰指针变量的时候
//const可以放在*的左边，限制的时pa指向的对象，也就是*pa不能修改
//但是pa不受限制
//const也可以放在*的有边,const的限制是pa,也就是pa的指向对象不能被改变
//但是*pa不受限制,也就是说pa指向的内容，是可以通过pa来改变的
//int main()
//{
//	int a = 10;
//	int b = 30;
//	int*  p = &a;
//	const int* pa = &a;
//	*p = 20;
//	p = &b;
//
//	//int* const pa = &a;
//	//pa = 20;
//
//	printf("%d", a);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int  b = 100;
//	const int*  pa = &a;
//	//*p = 20;
//
//}


//野指针
//野指针就是指针指向的位置是不可知的（随机的、不正确的、没有明确限制的）
//当指向的空间不是当前程序时候，就被称为野指针

//int main()
//{
//	int* pa;//当局部变量不初始化的时候，里面会随机存放一个值
//	*pa = 20;
//	//这是pa是一个野指针，里面存放的是一个随机值
//	//这是可能访问不是当前程序与的值
//	return 0;
//}



//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//int* p = &arr[0];
//	int* p = arr;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (int i = 0; i <= sz;i++)
//	{
//		printf("%d", *p);
//		p++;
//	}
//	return 0;
//}


//int* test()
//{
//	int n = 100;
//	return &n;
//}
//
//int main()
//{
//	int* p = test();
//	printf("hehe\n");
//	printf("%d", *p);
//
//	return 0;
//}



//应该怎么避免野指针
//1.指针哟啊初始化
//2.当不知到要给指针什么值，可以加null
//NULL是C语?中定义的?个标识符常量，值是0，0也是地址，这个地址是?法使?的，读写该地址
//会报错。
//不要返回局部变量的地址


//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = arr;
//	for (int i = 0; i < 5; i++)
//	{
//		*p = 5;
//		p++;
//	}
//	p = NULL;
//	if (p == NULL)
//	{
//		printf("p是空指针\n");
//	}
//	return 0;
//
//}

//int test()
//{
//	int n = 100;
//	return n;//但会局部变量
//}
//int main()
//{
//	int r = test();
//	printf("%d ", r);
//	return 0;
//}


//assert断言
//#define NDEBUG
//#include <assert.h>
//
//int main()
//{
//	int a = 100;
//	int* pa = NULL;
//	assert(pa != NULL);
//
//	printf("%d", *pa);
//	return 0;
//}




//strlen是用求字符串长度的， 统计的是\0之前的字符串的个数
//只需要给strlen传起始地址
#include<string.h>;
#include <assert.h>


//size_t my_strlen(const char* str)
//{
//	size_t count = 0;
//	assert(str != NULL);
//	while (*str !=0 )
//	{
//		count++;
//		str++;
//	}
//	return count;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len =my_strlen(arr);
//	printf("%zu\n", len);
//	return 0;
//}



//传值调⽤和传址调⽤
//这种函数调⽤⽅式叫：传址调⽤

//void swap(int a, int b)
//{
//	int z = 0;
//	z = a;
//	a = b;
//	b = z;
//
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前: a = %d  b = %d\n", a, b);
//	swap(a, b);
//	printf("交换后: a = %d  b = %d\n", a, b);
//	return 0;
//}


//这种函数调⽤⽅式叫：传址调⽤
//void swap(int* pa, int* pb)
//{
//	int z = 0;
//	z = *pa;
//	*pa = *pb;
//	*pb = z;
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int* pa =&a;
//	int* pb =&b;
//	printf("交换前: a = %d  b = %d\n", a, b);
//
//	swap(&a, &b);
//
//	printf("交换后: a = %d  b = %d\n", a, b);
//	return 0;
//}


//int main()
//{
//	int a = 10;
//	int* p = &a;
//	p = NULL;
//	//p = &a;
//	printf("%d", *p);
//	return 0;
//
//}

//size_t my_strlen(char* arr)
//{
//	int count = 0;
//	assert(*arr != NULL);
//	while (*arr != '\0')
//	{
//		count++;
//		arr++;
//	}
//	return count++;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len= my_strlen(arr);
//	printf("%zu\n", len);
//	return 0;
//}